package larc.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import larc.dao.intr.EmpresaDao;
import larc.model.Contactos;
import larc.model.Empresa;
import larc.util.HibernateUtil;

public class EmpresaDaoImpl implements EmpresaDao {


	//INSERTAR EMPRESA
	public void insertarEmpresa(Empresa empresa) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		try{
			session.beginTransaction();
			session.save(empresa);
			session.getTransaction().commit();			
		}catch(Exception e)
		{
			System.out.println("Error al insertar : " + e.getMessage());
			session.beginTransaction().rollback();
		}finally{
			   if (session != null && session.isOpen()) 
			   {
				   session.close();
			   }
		}
	}

	//ACTUALIZAR EMPRESA
	public void actualizarEmpresa(Empresa empresa) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		try{
			session.beginTransaction();
			session.update(empresa);
			session.getTransaction().commit();
			
		}catch(Exception e)
		{
			System.out.println("Error al actualizar : " + e.getMessage());
			session.beginTransaction().rollback();
			
		}finally{
			   if (session != null && session.isOpen()) 
			   {
				   session.close();
			   }
		}
	}

	//ELIMINAR EMPRESA
	public void eliminarEmpresa(Empresa empresa) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		try{
			session.beginTransaction();
			session.delete(empresa);
			session.getTransaction().commit();
			//session.close();
		}catch(Exception e)
		{
			System.out.println("Error al eliminar : " + e.getMessage());
			session.beginTransaction().rollback();
			
		}finally{
		   if (session != null && session.isOpen()) 
		   {
			   session.close();
		   }
		}
	}

	//BUSQUEDA DE LA EMPRESA POR ID o CODIGO
	public Empresa buscarxId(Integer id) {	
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		return (Empresa) session.load(Empresa.class,id);
		
	}
	
	@SuppressWarnings("unchecked")
	
	//LISTADO DE TODAS LAS EMPRESAS
	public List<Empresa> listarEmpresas() {
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		
		try{
			return session.createQuery("from Empresa e order by e.empNombre").list();
		}catch(Exception e)
		{
			System.out.println("Error al cargar : " + e.getMessage());
			
		}finally{
		   if (session != null && session.isOpen()) 
		   {
			   session.close();
		   }
		}
		return null;
	}
	
	//AGREGAR A CONTACTO A UNA EMPRESA
	public void agregarContacto(Contactos contacto)
	{
		Session session = HibernateUtil.getSessionFactory().openSession();
		try{
			session.beginTransaction();
			session.save(contacto);
			session.getTransaction().commit();		
		}catch(Exception e)
		{
			System.out.println("Error al agregar contacto : " + e.getMessage());
			session.beginTransaction().rollback();
		}finally{
			   if (session != null && session.isOpen()) 
			   {
				   session.close();
			   }
		}
	}

	@SuppressWarnings("unchecked")
	public List<Contactos> contactosxEmpresa(Integer idempresa) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		try{
			Query query = session.createQuery("Select c from Contactos c inner join c.empresas e where e.empCodigo = :id");
			query.setInteger("id",idempresa);
			return query.list();
		}catch(Exception e)
		{
			System.out.println("Error al cargar contactos por empresa con id "+ idempresa +" : " + e.getMessage());
		}finally{
			   if (session != null && session.isOpen()) 
			   {
				   session.close();
			   }
		}
		return null;
	}

	
	@SuppressWarnings("unchecked")
	public List<Contactos> listarContactos() {
		Session session = HibernateUtil.getSessionFactory().openSession();		
		try{
			return session.createQuery("from Contactos c").list();
		}catch(Exception e)
		{
			System.out.println("Error al cargar contactos : " + e.getMessage());
			
		}finally{
		   if (session != null && session.isOpen()) 
		   {
			   session.close();
		   }
		}
		return null;
	}

}
